Adding some more judges, here and there.
[and.git] / UVa / 11517 - Exact Change / c.2.cpp
blob7cf96dff00c91b412366a34ddceee8b6cfa819a3
1 /*
2 Problem: 11517 - Exact Change
3 Author: Andrés Mejía-Posada
4 (http://blogaritmo.factorcomun.org)
6 Accepted
7 */
9 using namespace std;
10 #include <algorithm>
11 #include <iostream>
12 #include <iterator>
13 #include <sstream>
14 #include <fstream>
15 #include <cassert>
16 #include <climits>
17 #include <cstdlib>
18 #include <cstring>
19 #include <string>
20 #include <cstdio>
21 #include <vector>
22 #include <cmath>
23 #include <queue>
24 #include <deque>
25 #include <stack>
26 #include <map>
27 #include <set>
29 #define D(x) cout << #x " is " << x << endl
31 const int S = 10005, N = 105, oo = INT_MAX / 4;
33 int dp[2][S*N+1], c[N];
36 dp[i][j] = Mínima cantidad de monedas para formar j pesos
37 utilizando las primeras i monedas. (0 <= i <= n)
40 int main(){
42 int C;
43 cin >> C;
44 while (C--){
46 int price;
47 cin >> price;
49 int n;
50 cin >> n;
52 int sum = 0;
53 c[0] = oo; // Don't fuck
55 int cota = S*N;
57 for (int i=1; i<=n; ++i){
58 cin >> c[i];
59 sum += c[i];
61 if (c[i] >= price) cota = min(cota, c[i]);
64 cota = min(cota, sum);
65 //sum = min(sum, price);
67 dp[0][0] = 0;
68 for (int j=1; j <= cota; ++j) dp[0][j] = oo;
70 for (int i=1; i<=n; ++i){
71 for (int j=0; j<=cota; ++j){
72 dp[i%2][j] = dp[(i+1)%2][j];
73 if (j - c[i] >= 0){
74 dp[i%2][j] = min(dp[i%2][j], dp[(i+1)%2][j-c[i]] + 1);
80 for (int i=0; i<=n; ++i){
81 for (int j=0; j<=sum; ++j){
82 printf("%10d ", dp[i][j]);
84 puts("");
88 for (int j=price; /*j <= sum*/; ++j){
89 if (dp[n%2][j] < oo){
90 cout << j << " " << dp[n%2][j] << endl;
91 break;
97 return 0;